package com.wjw.java.others.stringBuffer_;

/**
 * -------------------------------------------------------------------------------------
 * StringBuffer是线程安全的,它的底层方法都使用了synchronized关键字:代表可变的字符序列,可以对字符串内容进行增删,
 * -------------------------------------------------------------------------------------
 * String和StringBuffer区别：
 * -------------------------------------------------------------------------------------
 * String保存的是字符串常量,里面的值是不能更改,每次String类的更新实际上就是更改地址(即每次创建新对象),效率低
 * String的字符串值保存在private final char value[];中//堆中value的地址,指向常量池
 *
 * StringBuffer保存的是字符串变量,里面的值是可以改变的,每次StringBuffer的更新实际上可以更新内容
 * 不用每次更新地址(即不用每次创建新对象),效率高
 * 只有在空间不够的时候,会扩容空间,然后将原来的内容拷贝过来,指向新的地址
 * StringBuffer的字符串值保存在char value [];中//value地址在堆中
 */
public class StringBuffer_ {

    public static void main(String[] args) {
        //使用构造器创建StringBuffer
        //1.创建一个char[16],用于存放字符内容
        StringBuffer sb = new StringBuffer();
        //2.创建一个char[100],用于存放字符内容
        StringBuffer sb1 = new StringBuffer(100);
        //3.创建一个char[字符串长度+16],用于存放字符内容
        StringBuffer sb2 = new StringBuffer("Hello");

        StringToStringBuffer();
        StringBufferToString();
    }

    /**
     * String转为StringBuffer
     */
    public static void StringToStringBuffer(){
        String str = "HelloWorld";
        //1.使用构造器,
        //注意：返回的sb才是StringBuffer对象,堆str本身没有影响
        StringBuffer sb = new StringBuffer(str);
        //2.使用append方法
        StringBuffer sb2 = new StringBuffer();
        sb2 = sb2.append(str);
        System.out.println(sb.toString());
        System.out.println(sb2.toString());
    }

    /**
     * StringBuffer转为String
     */
    public static void StringBufferToString(){
        //1.使用构造器
        StringBuffer sb = new StringBuffer("HelloWorld");
        String str = new String (sb);
        //2.使用toString方法
        String str2 = sb.toString();
        System.out.println(str);
        System.out.println(str2);
    }
}
